package cn.dglydrpy.study.ssm.common.netty.demo.server;

import io.netty.buffer.ByteBuf;
import io.netty.buffer.Unpooled;
import io.netty.channel.ChannelHandlerContext;
import io.netty.channel.ChannelInboundHandler;
import io.netty.util.CharsetUtil;

/**
 * 自定义处理Handler
 * 
 * ChannelHandlerContext
 * 这是事件处理器上下文对象 ， Pipeline 链中的实际处理节点 。 
 * 每个处理节点 ChannelHandlerContext 中包含一个具体的事件处理器 ChannelHandler ,同时
 * ChannelHandlerContext 中也绑定了对应的 ChannelPipeline和 Channel 的信息，方便对ChannelHandler 进行调用
 * 
 * ChannelOutboundInvoker flush()，刷新
 * 
 * 
 */
public class NettyServerHandler implements ChannelInboundHandler {

    /**
     * 通道读取事件
     *
     * @param ctx
     * @param msg
     * @throws Exception
     */
    @Override
    public void channelRead(ChannelHandlerContext ctx, Object msg) throws Exception {
    	System.out.println("服务端 -- 通道读取事件");
        ByteBuf byteBuf = (ByteBuf) msg;
        System.out.println("客户端发送过来的消息:" + byteBuf.toString(CharsetUtil.UTF_8));
    }


    /**
     * 通道读取完毕事件
     *
     * @param ctx
     * @throws Exception
     */
    @Override
    public void channelReadComplete(ChannelHandlerContext ctx) throws Exception {
    	System.out.println("服务端 -- 通道读取完毕事件");
    	// 将数据写到 ChannelPipeline 中当前ChannelHandler的下一个ChannelHandler 开始处理（出站）
        ctx.writeAndFlush(
        	// 操作缓冲区的工具类  通过给定的数据和字符编码返回一个 ByteBuf 对象
        	Unpooled.copiedBuffer("你好.我是Netty服务端",CharsetUtil.UTF_8)
        );//消息出站
    }

    /**
     * 通道异常事件
     *
     * @param ctx
     * @param cause
     * @throws Exception
     */
    @Override
    public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) throws Exception {
    	System.out.println("服务端 -- 通道异常事件");
        cause.printStackTrace();
        // 关闭通道
        ctx.close();
    }
    
    /**
     * 通道就绪事件
     */
    @Override
    public void channelActive(ChannelHandlerContext ctx) throws Exception {
       System.out.println("服务端 -- 通道就绪事件");
    }
    

    @Override
    public void channelRegistered(ChannelHandlerContext ctx) throws Exception {

    }

    @Override
    public void channelUnregistered(ChannelHandlerContext ctx) throws Exception {

    }

    @Override
    public void channelInactive(ChannelHandlerContext ctx) throws Exception {

    }


    @Override
    public void userEventTriggered(ChannelHandlerContext ctx, Object evt) throws Exception {

    }

    @Override
    public void channelWritabilityChanged(ChannelHandlerContext ctx) throws Exception {

    }

    @Override
    public void handlerAdded(ChannelHandlerContext ctx) throws Exception {

    }

    @Override
    public void handlerRemoved(ChannelHandlerContext ctx) throws Exception {

    }


}
